import matplotlib.pyplot as plt
import numpy as np
import os
import glob as gb
import pandas as pd
import cv2
from skimage import io
import random
import keras
from keras.utils.vis_utils import plot_model
import skimage.transform as trans
from skimage.transform import resize
from keras.models import *
from keras.layers import *
from keras.optimizers import *
from keras.callbacks import ModelCheckpoint, LearningRateScheduler
from keras import backend as keras
from keras.preprocessing.image import ImageDataGenerator
import timeit
from numpy import expand_dims
!pip install -q -U albumentations
!echo "$(pip freeze | grep albumentations) is successfully installed"
let's first check our data folders to have a look to its content
train_path ="/content/drive/MyDrive/Colab Notebooks/UNET project/data/Train data"
test_path = "/content/drive/MyDrive/Colab Notebooks/UNET project/data/Test data"
mask_path = "/content/drive/MyDrive/Colab Notebooks/UNET project/data/Mask"
def openFolders(path):
for folder in os.listdir(path) :
files = gb.glob(pathname= str( path +'//' + folder + '/*.png'))
print('- For data {:<15} : found {} images in folder {:8}'.format(folder,len(files),folder))
openFolders(path=train_path)
openFolders(path=test_path)
openFolders(path=mask_path)
now we need to check the images sizes , to know how they looks like
def check_size_images(path):
size = []
for folder in os.listdir(path) :
files = gb.glob(pathname= str(path +'//' + folder + '/*.png'))
for file in files:
image = io.imread(file)
#image = np.expand_dims(image, axis=2)
size.append(image.shape)
df=pd.Series.value_counts(size)
print('Folder:',folder)
#print("-"*15)
print('Shape and number of the images = {}'.format(df))
print('-'*50)
check_size_images(train_path)
check_size_images(test_path)
check_size_images(mask_path)
now it's time to read all images & convert it into arrays
# Get images and masks
def Read_images(path):
X = []
for folder in os.listdir(path) :
files = sorted(gb.glob(pathname= str( path +'//' + folder + '/*png')))
print(f'Getting {folder} images ... ')
for file in files:
image = io.imread(file)
#image=img_to_array(image)
#image = np.expand_dims(image, axis=2)
#image_array=cv2.resize(image,(size,size))
X.append(list(image))
X_array = np.array(X) # convert list to array
print(f'- shape of {folder} data {X_array.shape}')
print(f'- {X_array.shape[0]} images , size = {X_array.shape[1]} X {X_array.shape[2]}')
print("-"*40)
return X_array
X_train=Read_images(train_path)
X_test=Read_images(test_path)
mask=Read_images(mask_path)
def visualize_images_and_masks (X,Y,no_of_images) :
"""
X : images (X_train)
Y :mask (label)
no_of_images : the number of images to show randomly
"""
#random without repetion
z=X.shape[0]
if no_of_images > z: print(f'ERREUR the number of images should be <= {z}')
else:
l=int(np.ceil(np.sqrt(no_of_images)))
plt.figure(figsize=(20,20))
n=0
for i in (random.sample(range(z),no_of_images) ):
plt.subplot(l*2,l,n+1)
imgmask=np.hstack((X[i],Y[i]))
plt.imshow(imgmask,'gray')
plt.title(f'image {i} \n image + mask')
plt.axis('off')
n=n+1
# let's choose 6 images
visualize_images_and_masks (X=X_train,Y=mask,no_of_images=6)
Generate “new” training samples from the original ones by applying random Fitters and perturbations (but at the same time ensuring that the class labels of the data are not changed).
Pour la classification d'image, nous devons modifier uniquement une image d'entrée et conserver les étiquettes de sortie intactes car les étiquettes de sortie sont invariantes aux modifications d'image.
Pour la segmentation, nous devons appliquer certaines transformations à la fois à une image d'entrée et à un masque de sortie. Nous devons également utiliser les mêmes paramètres pour la transformation d'image et la transformation de masque.(Lorsque on applique des transformations d'image telles que la mise en miroir ou la rotation ou le recadrage d'une partie de l'image d'entrée, on doit également appliquer la même transformation à l'étiquette de sortie pour préserver son exactitude.)
import albumentations as A
##############################################
Horizontal = A.HorizontalFlip(p=1)
Vertical =A.VerticalFlip(p=1)
Transpose=A.Transpose(p=1)
ElasticTransform= A.ElasticTransform(p=1, alpha=120, sigma=120 * 0.05, alpha_affine=120 * 0.03)
GridDistortion=A.GridDistortion(p=1)
OpticalDistortion= A.OpticalDistortion(distort_limit=1.6, shift_limit=0.5, p=1)
list_transformations=[Horizontal,Vertical,Transpose,ElasticTransform,GridDistortion,
OpticalDistortion]
def Transformation(Transformations = list_transformations ):
from itertools import combinations
global nb_transformations # need to use it after
transformations=[]
for i in range (1,len(list_transformations)+1):
Combination_transformation =combinations (list_transformations,i)
for trans in (Combination_transformation):
transform=A.Compose(list(trans))
transformations.append(transform)
nb_transformations=len(transformations)
print(f'- The number of transforamtions for each image is {nb_transformations} , Wait...')
return transformations
def DatasetGeneration(images,masks):
start = timeit.default_timer()
global image
image=list(images)
mask=list(masks)
################
augmented_images=[]
augmented_masks=[]
################
transformation=Transformation(Transformations = list_transformations )
for i in range(len(image)):
augmented_images.append(image[i])
augmented_masks.append(mask[i])
for transform in (transformation):
augmented = transform(image=image[i], mask=mask[i])
aug_image =augmented['image']
augmented_images.append(aug_image)
aug_mask = augmented['mask']
augmented_masks.append(aug_mask)
augmented_images = np.array(augmented_images)
print('DONE !')
print(f'- Number of images after Data Generation is {augmented_images.shape}')
augmented_masks=np.array(augmented_masks)
print(f'- Number of mask after Data Generation is {augmented_masks.shape}')
stop = timeit.default_timer()
t=stop - start
if t<60 :
print(f'Time execution : { np.round(t,2)} secondes')
else : print(f'- Time execution : { np.round((t/60),2)} minutes')
return augmented_images,augmented_masks
def display_data_generated(data,no_of_images,no_of_transforamtions=7):
n=0
lenT=nb_transformations+1
lenI=no_of_images*lenT
v=lenI/4
if no_of_transforamtions > lenT-1:
print(f'number of transormation should be less then or equal {lenT-1}')
else:
for j in range(lenT,lenI+1,lenT):
print('-'*130)
fig = plt.figure()
print('image',int(np.divide(j,lenT)-1))
print('-'*130)
LIST=[]
for i in range(j-lenT,j):
LIST.append(data[i])
for k in range(no_of_transforamtions+1):
fig.set_size_inches(20, 100)
ax = fig.add_subplot(v,4,n+1)
io.imshow(LIST[k])
if k == 0:plt.title('original image')
else:plt.title(f'transformation')
plt.axis('off')
n+=1
plt.show()
to see things better, we choose a normal image and not a medical image
def example(img):
transforamtion=Transformation(Transformations = list_transformations )
aug=[]
aug.append(img)
for transform in (transforamtion):
augmented = transform(image=img)
aug_image =augmented['image']
aug.append(aug_image)
aug=np.array(aug)
print('DONE!')
return aug
imgexample='/content/drive/MyDrive/Colab Notebooks/UNET project/data/Dataset Generation/example/RayzedPhotography.jpg'
img =io.imread(imgexample)
aug=example(img=img)
#let's show just 30 transformations
display_data_generated(data=aug,no_of_images=1,no_of_transforamtions=30)